package com.ce.pms.occupation.service.impl;


import java.util.Collections;
import java.util.Set;

import com.ce.pms.base.service.impl.PmsBaseServiceImpl;
import com.ce.pms.common.model.SysrefcodeDO;
import com.ce.pms.exception.BusinessException;
import com.ce.pms.occupation.dao.IDocumentReceiveSendDao;
import com.ce.pms.occupation.dao.IIdentityValidateDao;
import com.ce.pms.occupation.model.DocumentReceiveSendDO;
import com.ce.pms.occupation.model.IdentityValidateDO;
import com.ce.pms.occupation.service.IDocumentReceiveSendService;
import com.ce.pms.occupation.service.IIdentityValidateService;
import com.ce.pms.occupation.vo.DocumentReceiveSendVO;
import com.ce.pms.occupation.vo.IdentityValidateVO;
import com.ce.pms.system.occupation.model.AbsentDocumentItemConfigDO;
import com.ce.pms.system.occupation.model.SendDocumentItemConfigDO;
import com.ce.pms.system.occupation.vo.AbsentDocumentItemConfigVO;
import com.ce.pms.system.occupation.vo.SendDocumentItemConfigVO;
import com.ce.util.BeanUtil;
import com.sitechasia.webx.core.utils.base.PopulateUtil;


/**
 * 入伙资料收发服务实现类
 * @author 王浩羽
 *
 */
public class DocumentReceiveSendServiceImpl extends PmsBaseServiceImpl implements IDocumentReceiveSendService
{
	private IIdentityValidateService identityValidateService;
	private IIdentityValidateDao identityValidateDao;

	private IDocumentReceiveSendDao documentReceiveSendDao;


	public void setIdentityValidateDao(IIdentityValidateDao identityValidateDao)
	{
		this.identityValidateDao = identityValidateDao;
	}

	public void setIdentityValidateService(IIdentityValidateService identityValidateService)
	{
		this.identityValidateService = identityValidateService;
	}


	public void setDocumentReceiveSendDao(IDocumentReceiveSendDao documentReceiveSendDao)
	{
		this.documentReceiveSendDao = documentReceiveSendDao;
	}

	/**
	 * 功能描述: 是否允许资料收发 <br>
	 * @param identityValidateId
	 * @return
	 * Create author: 王浩羽 <br>
	 * Create on:Jan 9, 2009  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	private Boolean isAllowAddDocumentReceiveSend(Long identityValidateId)
	{
		// 钥匙移交后不能收发资料
		IdentityValidateDO identityValidate= identityValidateDao.findById(identityValidateId);
		if(identityValidate!=null && identityValidate.getHandoverState().equals(SysrefcodeDO.CONSTANTS_DIGITAL_ZERO))
		{
			return true;
		}
		return false;
	}


	/**
	 * @param documentReceiveSendVO
	 * @param documentReceiveSendDO
	 * @return DocumentReceiveSendDO
	 * @roseuid 494F4F6B00CB
	 */
	private DocumentReceiveSendDO assembleDocumentReceiveSendV2D(DocumentReceiveSendVO documentReceiveSendVO,
																	DocumentReceiveSendDO documentReceiveSendDO)
	{
		String[] ignore = new String[] {"identityValidate", "sendDocumentItemConfigs", "absentDocumentItemConfigs"};
		PopulateUtil.populate(documentReceiveSendVO, documentReceiveSendDO, ignore);
		IdentityValidateVO identityValidateVO = documentReceiveSendVO.getIdentityValidate();
		IdentityValidateDO identityValidateDO = new IdentityValidateDO();
		identityValidateService.assembleIdentityValidateV2D(identityValidateVO, identityValidateDO);
		documentReceiveSendDO.setIdentityValidate(identityValidateDO);

		Set<SendDocumentItemConfigVO> sendDocumentItemConfigVOSet = documentReceiveSendVO.getSendDocumentItemConfigs();
		Set<SendDocumentItemConfigDO> sendDocumentItemConfigDOSet = assembleSendDocumentItemConfigSetVO2DO(
																											sendDocumentItemConfigVOSet,
																											documentReceiveSendDO
																																	.getSendDocumentItemConfigs());
		documentReceiveSendDO.setSendDocumentItemConfigs(sendDocumentItemConfigDOSet);
		Set<AbsentDocumentItemConfigVO> absentDocumentItemConfigVOSet = documentReceiveSendVO
																								.getAbsentDocumentItemConfigs();
		Set<AbsentDocumentItemConfigDO> absentDocumentItemConfigDOSet = assembleAbsentDocumentItemConfigSetVO2DO(
																													absentDocumentItemConfigVOSet,
																													documentReceiveSendDO
																																			.getAbsentDocumentItemConfigs());
		documentReceiveSendDO.setAbsentDocumentItemConfigs(absentDocumentItemConfigDOSet);
		return documentReceiveSendDO;
	}


	/**
	 * 功能描述: Set 中对象VO转DO <br>
	 * @param voSet
	 * @param doSet
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	private Set<AbsentDocumentItemConfigDO> assembleAbsentDocumentItemConfigSetVO2DO(
																						Set<AbsentDocumentItemConfigVO> voSet,
																						Set<AbsentDocumentItemConfigDO> doSet)
	{
		for(AbsentDocumentItemConfigVO vo : voSet)
		{
			doSet.add(assembleAbsentDocumentItemConfigVO2DO(vo));
		}
		return doSet;
	}


	/**
	 * 功能描述: AbsentDocumentItemConfigVO 转 AbsentDocumentItemConfigDO<br>
	 * @param absentDocumentItemConfigVO
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	private AbsentDocumentItemConfigDO assembleAbsentDocumentItemConfigVO2DO(
																				AbsentDocumentItemConfigVO absentDocumentItemConfigVO)
	{
		AbsentDocumentItemConfigDO absentDocumentItemConfigDO = new AbsentDocumentItemConfigDO();
		BeanUtil.convertVoAsDo(absentDocumentItemConfigVO, absentDocumentItemConfigDO);
		return absentDocumentItemConfigDO;
	}


	/**
	 * 功能描述: Set 中对象VO转DO <br>
	 * @param voSet
	 * @param doSet
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	private Set<SendDocumentItemConfigDO> assembleSendDocumentItemConfigSetVO2DO(Set<SendDocumentItemConfigVO> voSet,
																					Set<SendDocumentItemConfigDO> doSet)
	{
		for(SendDocumentItemConfigVO vo : voSet)
		{
			doSet.add(assembleSendDocumentItemConfigVO2DO(vo));
		}
		return doSet;
	}


	/**
	 * 功能描述: SendDocumentItemConfigVO 转 SendDocumentItemConfigDO <br>
	 * @param sendDocumentItemConfigVO
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	private SendDocumentItemConfigDO assembleSendDocumentItemConfigVO2DO(
																			SendDocumentItemConfigVO sendDocumentItemConfigVO)
	{
		SendDocumentItemConfigDO sendDocumentItemConfigDO = new SendDocumentItemConfigDO();
		BeanUtil.convertVoAsDo(sendDocumentItemConfigVO, sendDocumentItemConfigDO);
		return sendDocumentItemConfigDO;
	}


	/**
	 * 功能描述: DocumentReceiveSendDO 转 DocumentReceiveSendVO<br>
	 * @param documentReceiveSendDO
	 * @param documentReceiveSendVO
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	private DocumentReceiveSendVO assembleDocumentReceiveSendD2V(DocumentReceiveSendDO documentReceiveSendDO,
																	DocumentReceiveSendVO documentReceiveSendVO)
	{
		String[] ignore = new String[] {"identityValidate", "sendDocumentItemConfigs", "absentDocumentItemConfigs"};
		PopulateUtil.populate(documentReceiveSendDO, documentReceiveSendVO, ignore);
		IdentityValidateDO identityValidateDO = documentReceiveSendDO.getIdentityValidate();
		IdentityValidateVO identityValidateVO = new IdentityValidateVO();
		identityValidateService.assembleIdentityValidateD2V(identityValidateDO, identityValidateVO);
		documentReceiveSendVO.setIdentityValidate(identityValidateVO);

		Set<SendDocumentItemConfigDO> sendDocumentItemConfigDOSet = documentReceiveSendDO.getSendDocumentItemConfigs();
		Set<SendDocumentItemConfigVO> sendDocumentItemConfigVOSet = assembleSendDocumentItemConfigSetDO2VO(
																											sendDocumentItemConfigDOSet,
																											documentReceiveSendVO
																																	.getSendDocumentItemConfigs());
		documentReceiveSendVO.setSendDocumentItemConfigs(sendDocumentItemConfigVOSet);
		Set<AbsentDocumentItemConfigDO> absentDocumentItemConfigDOSet = documentReceiveSendDO
																								.getAbsentDocumentItemConfigs();
		Set<AbsentDocumentItemConfigVO> absentDocumentItemConfigVOSet = assembleAbsentDocumentItemConfigSetDO2VO(
																													absentDocumentItemConfigDOSet,
																													documentReceiveSendVO
																																			.getAbsentDocumentItemConfigs());
		documentReceiveSendVO.setAbsentDocumentItemConfigs(absentDocumentItemConfigVOSet);
		return documentReceiveSendVO;
	}


	/**
	 * 功能描述: Set 中对象DO转VO <br>
	 * @param doSet
	 * @param voSet
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	private Set<AbsentDocumentItemConfigVO> assembleAbsentDocumentItemConfigSetDO2VO(
																						Set<AbsentDocumentItemConfigDO> doSet,
																						Set<AbsentDocumentItemConfigVO> voSet)
	{
		for(AbsentDocumentItemConfigDO doObj : doSet)
		{
			voSet.add(assembleAbsentDocumentItemConfigDO2VO(doObj));
		}
		return voSet;
	}


	/**
	 * 功能描述: AbsentDocumentItemConfigDO 转 AbsentDocumentItemConfigVO<br>
	 * @param absentDocumentItemConfigDO
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	private AbsentDocumentItemConfigVO assembleAbsentDocumentItemConfigDO2VO(
																				AbsentDocumentItemConfigDO absentDocumentItemConfigDO)
	{
		if(absentDocumentItemConfigDO==null)
		{
			return null;
		}
		AbsentDocumentItemConfigVO absentDocumentItemConfigVO = new AbsentDocumentItemConfigVO();
		PopulateUtil.populate(absentDocumentItemConfigDO, absentDocumentItemConfigVO);
		return absentDocumentItemConfigVO;
	}


	/**
	 * 功能描述: Set 中对象DO转VO <br>
	 * @param doSet
	 * @param voSet
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	@SuppressWarnings("unchecked")
	private Set<SendDocumentItemConfigVO> assembleSendDocumentItemConfigSetDO2VO(Set<SendDocumentItemConfigDO> doSet,
																					Set<SendDocumentItemConfigVO> voSet)
	{
		if(doSet==null)
		{
			return Collections.EMPTY_SET;
		}
		for(SendDocumentItemConfigDO doObj : doSet)
		{
			voSet.add(assembleSendDocumentItemConfigDO2VO(doObj));
		}
		return voSet;
	}


	/**
	 * 功能描述: SendDocumentItemConfigDO 转 SendDocumentItemConfigVO <br>
	 * @param sendDocumentItemConfigDO
	 * @return Create author: 王浩羽 <br>
	 *         Create on:Jan 4, 2009 <br>
	 *         Edit author: <br>
	 *         Edit on: <br>
	 *         Why: <br>
	 */
	private SendDocumentItemConfigVO assembleSendDocumentItemConfigDO2VO(
																			SendDocumentItemConfigDO sendDocumentItemConfigDO)
	{
		if(sendDocumentItemConfigDO == null)
		{
			return null;
		}
		SendDocumentItemConfigVO sendDocumentItemConfigVO = new SendDocumentItemConfigVO();
		PopulateUtil.populate(sendDocumentItemConfigDO, sendDocumentItemConfigVO);
		return sendDocumentItemConfigVO;
	}



	public DocumentReceiveSendVO addDocumentReceiveSend(DocumentReceiveSendVO docReceiveSend)
	{
		if(!isAllowAddDocumentReceiveSend(docReceiveSend.getIdentityValidate().getKeyword()))
		{
			throw new BusinessException("occupation:occupation_documentReceiveSend_add_exception", BusinessException.WARNING);
		}
		DocumentReceiveSendDO documentReceiveSendDO = new DocumentReceiveSendDO(docReceiveSend.getKeyword());
		assembleDocumentReceiveSendV2D(docReceiveSend, documentReceiveSendDO);
		documentReceiveSendDao.saveOrUpdateObject(documentReceiveSendDO);
		notifyAddedDocumentReceiveSend(docReceiveSend.getIdentityValidate().getKeyword());
		// TODO 计算费用
		return docReceiveSend;
	}

	/**
	 * 功能描述: 通知资料已经收发 <br>
	 * @param identityValidateId
	 * Create author: 王浩羽 <br>
	 * Create on:Jan 9, 2009  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	private void notifyAddedDocumentReceiveSend(Long identityValidateId)
	{
		identityValidateService.receiveAddedDocumentReceiveSend(identityValidateId);
	}


	public DocumentReceiveSendVO getDocumentReceiveSendBy(Long identityId)
	{
		DocumentReceiveSendDO documentReceiveSendDO = documentReceiveSendDao.getDocumentReceiveSendBy(identityId);
		if(documentReceiveSendDO==null)
		{
			return null;
		}
		DocumentReceiveSendVO documentReceiveSendVO = new DocumentReceiveSendVO();
		assembleDocumentReceiveSendD2V(documentReceiveSendDO,documentReceiveSendVO);
		return documentReceiveSendVO;
	}
}
